package com.example.test1.store;


import com.example.test1.POJO.ChatMessages;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.ChatMessageDeserializer;
import dev.langchain4j.data.message.ChatMessageSerializer;
import dev.langchain4j.store.memory.chat.ChatMemoryStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;

import java.util.LinkedList;
import java.util.List;

//持久化存储类，实现了ChatMemoryStore接口，用于向mongodb中存储聊天记录,三个关键方法
@Component
public class MongoChatMemoryStore implements ChatMemoryStore {

    //使用mongodb存储数据
    @Autowired
    private MongoTemplate mongoTemplate;


    //切记，这里的ChatMessage是longchain4j提供的类型，不是自己写的pojo
    //这里的ChatMessage表示大模型返回的相应信息（包括文本，提问的角色等等）

    //方法1---取出某条ChatMessage聊天记录对象，在mongodb中是序列化的字符串形式，在java类中要反序列化为ChatMessage对象
    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        //哪怕pojo类中没有memoryId这个属性，也可以通过Criteria.where("memoryId").is(memoryId)来查询，查不到则插入
        Criteria criteria = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(criteria);
        //findOne返回
        ChatMessages chatMessages = mongoTemplate.findOne(query, ChatMessages.class);
        if(chatMessages == null) return new LinkedList<>();
        //数据库中content字段 存放的是 ChatMessage的json字符串 反序列化为ChatMessage的java类的列表
        return ChatMessageDeserializer.messagesFromJson(chatMessages.getContent());
    }

    //将ChatMessage（java类）聊天记录 列表 存入
    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        Criteria criteria = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(criteria);
        Update update = new Update();

        //将ChatMessage对象序列化为json字符串，存入mongodb
        update.set("content", ChatMessageSerializer.messagesToJson(messages));
        //根据query条件能查询出文档，则修改文档；否则新增文档
        mongoTemplate.upsert(query, update, ChatMessages.class);
    }
    //将Mongodb中的若干行删除
    @Override
    public void deleteMessages(Object memoryId) {
        Criteria criteria = Criteria.where("memoryId").is(memoryId);
        Query query = new Query(criteria);
        mongoTemplate.remove(query, ChatMessages.class);
    }
}
